/*
 * Facade.java
 *
 * Created on 21 de Março de 2007, 13:33
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package br.ufal.ic.fracao.facade;

import br.ufal.ic.fracao.dao.GenericDAO;
import br.ufal.ic.fracao.dao.GenericDAOImpl;
import br.ufal.ic.fracao.dao.HibernateUtility;
import br.ufal.ic.fracao.dao.problem.ProblemaDAOImpl;
import br.ufal.ic.fracao.dao.problem.SuportePedagogicoDAOImpl;
import br.ufal.ic.fracao.dao.problem.UnidadeDAOImpl;
import br.ufal.ic.fracao.dao.user.AprendizDAOImpl;
import br.ufal.ic.fracao.dao.user.ProfessorDAOImpl;
import br.ufal.ic.fracao.model.problem.Problema;
import br.ufal.ic.fracao.model.problem.SuportePedagogico;
import br.ufal.ic.fracao.model.problem.Unidade;
import br.ufal.ic.fracao.model.user.Ambiente;
import br.ufal.ic.fracao.model.user.Aprendiz;
import br.ufal.ic.fracao.model.user.Cadastro;
import br.ufal.ic.fracao.model.user.Professor;
import jade.domain.FIPAAgentManagement.AMSAgentDescription;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.hibernate.Session;
import org.omg.PortableInterceptor.LOCATION_FORWARD;

/**
 *
 * @author guilherme
 */
public class DataBaseFacade {
    
    /** Creates a new instance of Facade */
    public DataBaseFacade() {
    }
    
    //------------------------------ Aprendiz---------------------------------
    
    public void insertAprendiz(Aprendiz aprendiz) throws Exception {
        GenericDAOImpl objectDAO = new AprendizDAOImpl();
        try {
	        if (objectDAO.isUnique(aprendiz.getEmail(), "email")) {
	            objectDAO.save(aprendiz);
	        } 
        } catch(Exception e) {
	            throw new Exception("O e-mail " + aprendiz.getEmail() + " ja esta cadastrado");
        }
    }
    
    public Aprendiz getAprendiz(String email) throws Exception {
        GenericDAOImpl objectDAO = new AprendizDAOImpl();
        
        try {
            return (Aprendiz) objectDAO.getField("email", email);
        } catch (Exception e) {
            throw new Exception("Aprendiz nao existente");
        }
    }
    
    public Aprendiz getAprendizLogin(String valueEmail, String valueSenha) throws Exception {
        AprendizDAOImpl objectDAO = new AprendizDAOImpl();
        
        try {
            return (Aprendiz) objectDAO.getFields(valueEmail, valueSenha);
        } catch (Exception e) {
            throw new Exception("Aprendiz nao existente");
        }
    }
    
    public void deleteAprendiz(Aprendiz aprendiz) throws Exception {
        GenericDAOImpl objectDAO = new AprendizDAOImpl();
        
        try {
            objectDAO.delete(aprendiz);
        } catch (Exception e) {
            throw new Exception("Aprendiz nao existente");
        }
    }
    
    public void updateAprendiz(Aprendiz aprendiz) throws Exception {
        GenericDAOImpl objectDAO = new AprendizDAOImpl();
        
        try {
            objectDAO.update(aprendiz);
        } catch (Exception e) {
            throw new Exception("Aprendiz nao existente");
        }
    }
    
    public List<Aprendiz> getAllAprendiz(){
        GenericDAOImpl objectDAO = new AprendizDAOImpl();
        
        return objectDAO.listAll(); 
    }
    //-------------------------Professor------------------------------------
    
    public void insertProfessor(Professor professor) throws Exception {
        GenericDAOImpl objectDAO = new ProfessorDAOImpl();
        
        try {
            if (objectDAO.isUnique(professor.getEmail(), "email")) {
                objectDAO.save(professor);
            }
        } catch(Exception e) {
            throw new Exception("O e-mail " + professor.getEmail() + " ja esta cadastrado");
        }
    }
    
    public Professor getProfessor(String email) throws Exception {
        GenericDAOImpl objectDAO = new ProfessorDAOImpl();
        
        try {
            return (Professor) objectDAO.getField("email", email);
        } catch (Exception e) {
            throw new Exception("Professor nao existente");
        }
    }
    
    public void deleteProfessor(Professor professor) throws Exception {
        GenericDAOImpl objectDAO = new ProfessorDAOImpl();
        
        try {
            objectDAO.delete(professor);
        } catch (Exception e) {
            throw new Exception("Professor nao existente");
        }
    }
    
    public void updateProfessor(Professor professor) throws Exception {
        GenericDAOImpl objectDAO = new ProfessorDAOImpl();
        
        try {
            objectDAO.update(professor);
        } catch (Exception e) {
            throw new Exception("Professor nao existente");
        }
    }
    
    //--------------------------------UnidadePedagogica----------------------------------
    
    public void insertUnidade(Unidade unidade) {
        GenericDAOImpl objectDAO = new UnidadeDAOImpl();
        
        try {
            objectDAO.save(unidade);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public Unidade getUnidade(String name) throws Exception {
        GenericDAOImpl objectDAO = new UnidadeDAOImpl();
        
        try {
            return (Unidade) objectDAO.getField("nome", name);
        } catch (Exception e) {
            throw new Exception("Unidade " + name + " not found");
        }
    }
    
    public void deleteUnidade(Unidade unidade) throws Exception {
        GenericDAOImpl objectDAO = new UnidadeDAOImpl();
        
        try {
            objectDAO.delete(unidade);
        } catch (Exception e) {
            throw new Exception("Unidade could not be deleted");
        }
    }
    
    public void updateUnidade(Unidade unidade) throws Exception {
        GenericDAOImpl objectDAO = new UnidadeDAOImpl();
        
        try {
            objectDAO.update(unidade);
        } catch (Exception e) {
            throw new Exception("Unidade could not be updated");
        }
    }
    
    public List<Unidade> getAllUnidade() throws Exception {
        GenericDAOImpl objectDAO = new UnidadeDAOImpl();
        
        try {
            return objectDAO.listAll();
        } catch (Exception e) {
            throw new Exception("could not get all Unidades");
        }
    }
    
    //---------------------------Problema----------------------------------
    
    public void insertProblema(Problema problema) {
        GenericDAOImpl objectDAO = new ProblemaDAOImpl();
        
        try {
            objectDAO.save(problema);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public Problema getProblema(String expressao) throws Exception {
    	GenericDAOImpl objectDAO = new ProblemaDAOImpl();
    	
    	try {
            return (Problema) objectDAO.getField("expressao", expressao);
        } catch (Exception e) {
            throw new Exception("Problema " + expressao + " not found");
        }
    }
    
    public void deleteProblema(Problema problema) throws Exception {
        GenericDAOImpl objectDAO = new ProblemaDAOImpl();
        
        try {
            objectDAO.delete(problema);
        } catch (Exception e) {
            throw new Exception("Problema could not be deleted");
        }
    }
    
    public void updateProblema(Problema problema) throws Exception {
        GenericDAOImpl objectDAO = new ProblemaDAOImpl();
        
        try {
            objectDAO.update(problema);
        } catch (Exception e) {
            throw new Exception("Unidade could not be updated");
        }
    }
    
    public List<Problema> getAllProblema() {
        /*List<Problema> problemas = new ArrayList<Problema>();
        
        try {
            for (Unidade u : getAllUnidade()) {
                problemas.addAll(u.getProblemas());
            }
            return problemas;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return problemas;*/
    	GenericDAOImpl objectDAO = new ProblemaDAOImpl();
    	return objectDAO.listAll();
    }
    
}
